home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-20 / rs0422.zip / LEVEL2 / AX25.C next >
C/C++ Source or Header  |  1990-11-13  |  3KB  |  142 lines

  1. #include "buffer.h"
  2. #include "iface.h"
  3. #include "timer.h"
  4. #include "ax25.h"
  5. #include "ax25l2.h"
  6. #include "netuser.h"
  7. #include "data.h"
  8. #include "hdlctl.h"
  9.  
  10. unsigned char ctl_NS, ctl_PF, ctl_NR;
  11. unsigned char digi;
  12.  
  13. int
  14. get_addr(bpx, adr, mon)
  15. struct datastr *bpx;
  16. register struct ax25_addr *adr;
  17. unsigned char mon;    /* True if monitoring, False if real */
  18. {
  19.     static int i, j;
  20.     static unsigned char numadr, *chd;
  21.     static struct datastr *bp;
  22.  
  23.     numadr=digi=0;
  24.     bp=bpx;
  25.     for (;numadr<7;numadr++, adr++) {
  26.         for (i=0;i<ALEN;i++) {
  27.             if (((j=bgetch(&bp)) == EOF) || (j & E)) {
  28.                 j= EOF;
  29.                 break;
  30.             }
  31.             adr->call[i]=j;
  32.         }
  33.         if (j == EOF) break;
  34.         chd = bp->rdata;    /* Point to next rx ssid */
  35.         if ((j=bgetch(&bp)) == EOF) break;
  36.         adr->ssid=j;
  37.  
  38.         if(!digi && numadr>1 && !(j & REPEATED)) {
  39.             digi=numadr;
  40.             if (!mon)
  41.                 *chd |= REPEATED; /* Incase we repeat it */
  42.         }
  43.         if (j & E) break;
  44.     }
  45.     if (j != EOF) return (numadr+1);
  46.     free_pkt(bp);
  47.     return 0;
  48. }
  49.  
  50. int
  51. decode_ctl(control)
  52. unsigned char control;
  53. {
  54.     static unsigned char ctl, i;
  55.     static unsigned char hdlc[10]={I,RR,RNR,REJ,UI,DISC,UA,FRMR,DM,SABM};
  56.  
  57.     ctl = control>>1;
  58.     ctl_NS = ctl&7;
  59.     ctl = ctl>>3;
  60.     ctl_PF = ctl&1;
  61.     ctl = ctl>>1;
  62.     ctl_NR = ctl&7;
  63.     ctl = control;
  64.     if ((ctl&1) == 0) return 0; /* I Frame */
  65.     else if ((ctl&2) == 0) ctl= (ctl&0x0f); /* Supervisory */
  66.     else ctl = (ctl & ~PF);    /* Unnumbered */
  67.     for (i=1;i<10;i++) if (hdlc[i] == ctl) return i;
  68.     return i;
  69. }
  70.  
  71.  
  72.  
  73. #if 0
  74.  
  75.     struct hdlcx hdlc[]={
  76. /* 0    */    {ctl_bit,3},
  77. /* 1    */    {ctl_ns,0},
  78. /* 3    */    {ctl_nr,0},
  79. /* 4    */    {ctl_ret,ctl_I},
  80. /* 5    */    {ctl_bit,7},
  81. /* 6    */    {ctl_nr,0},
  82. /* 7    */    {ctl_bit,3},
  83. /* 8    */    {ctl_bit,1},
  84. /* 9    */    {ctl_ret,ctl_RR},
  85. /* 10    */    {ctl_ret,ctl_REJ},
  86. /* 11    */    {ctl_bit,7},
  87. /* 12    */    {ctl_ret,ctl_RNR},
  88. /* 14    */    {ctl_bit,7},
  89. /* 15    */    {ctl_bit,3},
  90. /* 16    */    {ctl_bit,1},
  91. /* 17    */    {ctl_ret,ctl_UI},
  92. /* 18    */    {ctl_ret,ctl_DISC},
  93. /* 19    */    {ctl_bit,1},
  94. /* 20    */    {ctl_err,0},
  95. /* 21    */    {ctl_ret,ctl_UA},
  96. /* 22    */    {ctl_bit,2},
  97. /* 23    */    {ctl_bit,2},
  98. /* 24    */    {ctl_frmr,ctl_FRMR},
  99. /* 26    */    {ctl_bit,1},
  100. /* 27    */    {ctl_err,0},
  101. /* 28    */    {ctl_bit,3},
  102. /* 29    */    {ctl_bit,1},
  103. /* 30    */    {ctl_ret,ctl_DM},
  104. /* 31    */    {ctl_ret,ctl_SABM},
  105. /* 32    */    {ctl_err,0}
  106.     };
  107.  
  108. int
  109. decode_ctl(control)
  110. unsigned char control;
  111. {
  112.     static unsigned char ctl, st;
  113.     register struct hdlcx *hd;
  114.  
  115.     ctl = control;
  116.     ctl_NR = ctl_NS = ctl_PF = -1;
  117.     st=0;
  118.     while (st != 255) {
  119.         hd = &hdlc[st];
  120.         switch (hd->action) {
  121.             case 0:    if (ctl&1) st += hd->par;
  122.                 ctl = ctl>>1;
  123.                 break;
  124.             case 1:    ctl_NS = ctl&7;
  125.                 ctl = ctl>>3;
  126.                 break;
  127.             case 2: ctl_NR = ctl&7;
  128.                 ctl_PF = ctl&8;
  129.                 ctl = ctl>>4;
  130.                 break;
  131.             case 3: if (ctl != 4) return -1;
  132.                 /* else return ctl_FRMR; (in .par) */
  133.             case 4: return (hd->par);
  134.             default: return (-1);
  135.         }
  136.         st++;
  137.     }
  138.     return (-1);
  139. }
  140. #endif
  141.  
  142.